package user

import user.Petiano;
import user.Tutor;
import user.User;


/**
 * Classe de serviço oferecida para manipulação dos usuários no sistema.
 * 
 * @author Vítor Avelino - vitor88@gmail.com
 *
 */
class UserService {
	
	/**
	 * Verifica a autenticação do usuário que tenta fazer login no sistema.
	 * 
	 * @param login		Login do usuário
	 * @param password	Senha do usuário
	 * @return	null	Caso login e usuário não casem
	 * 			usuario	Caso contrário
	 */
	def authenticate(login, password) {
		return User.authenticate(login, password)
	}
	
	/**
	 * Retorna o tutor responsável pelo PET local.
	 * 
	 * @return 	null  Se não possuir tutor cadastrado
	 * 			tutor Caso contrário
	 */
	def getTutor() {
		return Tutor.list(max:1)?.get(0)
	}
	
	/**
	 * Retorna lista de petianos de acordo com os parâmetros que lhe são passados.
	 * 
	 * @param params Mapa que contém os parâmetros da consulta.
	 * @return l Lista de petianos
	 */
	def getPetianos(params) {
		return Petiano.list(params)
	}
	
	/**
	 * Retorna o número de petianos armazenados no sistema.
	 * 
	 * @return n Número de petianos
	 */
	def getNumberPetianos() {
		return Petiano.count()
	}
	
	/**
	 * Retorna o número de tutores armazenados no sistema.
	 * 
	 * @return n Número de tutores
	 */
	def getNumberTutors() {
		return Tutor.count()
	}
	
	/**
	 * Salva o usuário no banco de dados do sistema
	 * 
	 * @param user Usuário a ser salvo
	 * @return	null	Caso os dados do usuário não sejam validados
	 * 					ou aconteça algum erro durante a operação
	 * 			usuario Caso contrário
	 * 	
	 */
	def save(user) {
		if (user.validate()) {
			return user.save(flush:true)
		}
		return null
	}
	
	/**
	 * Retorna usuário pelo login armazenado no sistema.
	 *  
	 * @param id Id do usuário
	 * @return 	null 	Caso o id seja inexistente
	 * 			usuario	Caso contrário
	 */
	def getUserByLogin(id) {
		return User.get(id)
	}
	
	/**
	 * Retorna petiano pelo id armazenado no sistema.
	 *  
	 * @param id Id do petiano
	 * @return 	null 	Caso o id seja inexistente
	 * 			tutor 	Caso contrário
	 */
	def getPetianoById(id) {
		return Petiano.get(id)
	}
	
	/**
	 * Retorna petiano pelo email armazenado no sistema.
	 *  
	 * @param email Email do petiano
	 * @return 	null 	Caso o email seja inexistente
	 * 			petiano Caso contrário
	 */
	def getPetianoByEmail(email) {
		return Petiano.findByEmail(email)
	}
	
	/**
	 * Remove usuário armazenado no sistema passado como argumento.
	 * 
	 * @param user Usuário a ser removido.
	 * @return	null Caso ocorra algum erro durante remoção
	 * 			true Caso contrário
	 */
	def delete(user) {
		return user.delete(flush:true)
	}
	
}
